package com.example.kotlindemo.constructorstudy

import android.util.Log

/**
 * 该类 主要分析记录构造方法
 */

// 1.子类，继承父类   :类名()
// 2.主构造函数属于类头的一部分= 跟在类名后面，采用constructor关键字
// constructor（参数名：参数类型）；若主构造函数没有任何注解（可见性修饰符），可省略关键字
//class Fruits (color :String ) : Food(){
/**
 *   一旦声明了主构造器，就包含两点：
 *          1. 必须性：创建类的对象时，不管使用哪个构造器，都需要主构造器的参与
 *          2. 第一性：在类的初始化过程中，首先执行的就是主构造器
 */


// 4.次构造函数，必须加constructor关键字，一个类可以有多个构造函数，只是传入参数不同

// 这里与构造器中的 name 是同一个
//var name: String = name


//添加一个name参数  的主构造器（再配合init初始化）
class Fruits constructor(name :String ) : Food(){

    //主构造器中的参数在类的属性中使用
   var name:String ?= name
   var name2:String ?= null


    //3.初始化的代码放到以init关键字作为前缀的代码块中
    // 初始化代码块，先于下面的构造器执行
    //主构造器中的参数，在init中使用
    //init代码块，紧跟在主构造器之后执行，因为主构造器本身没有代码体
    //init代码块充当了主构造器代码体的功能
    init {
        this.name2 = name
        println("init 执行")
    }


    //次构造函数1
    //这样写出错，和主构造函数一样
//    constructor(name:String):this(name){
//        println("次构造方法一")
//    }

    //次构造函数2
    constructor(price:Double,name:String):this(name){
        println(price)
    }

    //次构造函数3
    constructor(name:String,price:Double,color:String):this(name){
        println("次构造方法二$price  $name")
    }


    //4. 构造方法总结：次要构造函数，依赖于主构造函数，主构造函数需要的参数
    //次构造函数都得有，但是次构造函数，可以有其它的参数形式。需要调用init




    override fun banana() {
        super.banana()
        Log.e("long","打印构造函数参数")
    }

    fun println(){
        println("主构造函数传递的参数  $name")
    }
}